/**
主要回顾：继承

extends 关键字：表示两个类有继承关系
    继承的格式：
        class 类名1 extends 类名 2{
        
        }

super关键字：代表了父类空间的引用
    1.子父类中存在同名成员时，默认访问子类成员，super 关键字可以指定访问父类成员
    2.创建子类对象时，默认调用父类无参构造函数，super 关键字可以指定调用父类带参构造方法
    3.调用父类构造函数时，该语句必须在构造函数的第一个语句
    4.this 关键字与 super 关键字不能同时在同一个构造函数中调用其他构造函数（2 个都需要在第一个语句）
    
方法重写：子父类出现同名函数
    1.方法名与形参列表必须一致
    2.子类的仅限修饰符要大于等于父类权限修饰符（交际圈，越来越大）
    3.子类的返回类值型必须小于或者等于父类的返回值类型（越来越具体）
    4.子类抛出的异常必须小于或等于父类抛出的异常（进化，异常越少）
    
区别方法重载：一个类中出现两个或以上同名函数。
    1.函数名要一致
    2.形参列表不一致（类型、数量）
    3.与返回值类型无关
    
instanceof 关键字：判断一个对象是否属于指定类别
    格式：对象 instanceof 类别
*/

/*
父类
*/
class Father{
    String name;
    String test = "father test";

    //带参构造方法
    public Father(String name){
        this.name = name;
    }
    public void eat(){
        System.out.println( name + " eating bad food...");
    }
}

/*
子类，继承父类
*/
class Son extends Father{
    String test = "son test";
    
    //带参构造方法
    public Son(String name){
        super(name);        //使用 super 关键字调用父类的构造函数初始化对象
    }
    
    public void printTest(){
        System.out.println("test in son: " + test);
        //当重名时，使用 super 关键字访问父类成员变量
        System.out.println("test in father: " + super.test);    
    }
    
    //方法重写
    public void eat(){
        System.out.println( name + " eating good food...");
    }  
    
}

class LearnExtends {
    public static void main(String[] args) {
        Son son = new Son("Son");
        son.eat();
        son.printTest();
        
        //测试 instanceof 关键字
        Father father = new Father("Father");
        System.out.println( son instanceof Son);
        System.out.println( son instanceof Father);
        System.out.println( father instanceof Son);
    }
}